
package br.com.dp.web.mbean.login;

import java.io.IOException;
import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import lombok.Getter;
import lombok.Setter;
import br.com.dp.dto.dominio.PaginasEnum;
import br.com.dp.dto.dominio.PerfilEnum;
import br.com.dp.servidor.interceptador.anotacao.Seguranca;

/**
 * @author messias.xavier
 * MBean responsável por fornecer as funcionalidades de login.
 */
@Named
@SessionScoped
public class LoginMBean implements Serializable
{

   /** @TODO Comentar atributo */
   private static final long serialVersionUID = 2723407187725323638L;
   
   /**
    * Login do usuário
    */
   @Getter
   @Setter
   private String username;
   
   /**
    * Senha do usuário
    */
   @Getter
   @Setter
   private String password;

   /**
    * Método responsável por realizar o login.
    * 
    * @param actionEvent
    */
   @Seguranca(perfil={PerfilEnum.ADM, PerfilEnum.PRP, PerfilEnum.FNC, PerfilEnum.CLT})
   public void login(ActionEvent actionEvent)
   {

      FacesContext context = FacesContext.getCurrentInstance();
      HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
      try
      {
         String navigateString = "";
         
         // Verifica se o usuário e a senha são válidos. Senão lança uma exceção ServletException
         request.login(username, password);

         if (request.isUserInRole(PerfilEnum.ADM.getPerfil()))
         {
            navigateString = PaginasEnum.INDEX_ADM.getPagina();
         }
         else if (request.isUserInRole(PerfilEnum.PRP.getPerfil()))
         {
            navigateString = PaginasEnum.INDEX_PRP.getPagina();
         }
         else if (request.isUserInRole(PerfilEnum.FNC.getPerfil()))
         {
            navigateString = PaginasEnum.INDEX_FNC.getPagina();
         }
         else if (request.isUserInRole(PerfilEnum.CLT.getPerfil()))
         {
            navigateString = PaginasEnum.INDEX_CLT.getPagina();
         }
         try
         {
            context.getExternalContext().redirect(request.getContextPath() + navigateString);
         }
         catch (IOException ex)
         {
            context.addMessage(null, new FacesMessage("Error!", "Exception occured"));
         }
      }
      catch (ServletException e)
      {
         context.addMessage(null, new FacesMessage("Error!", "The username or password you provided does not match our records."));
      }
   }

   /**
    * Método responsável por fazer o logout do usuário.
    */
   @Seguranca(perfil={PerfilEnum.ADM, PerfilEnum.PRP, PerfilEnum.FNC, PerfilEnum.CLT})
   public void logout()
   {
      HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
      if (session != null)
      {
         session.invalidate();
      }
      FacesContext.getCurrentInstance().getApplication().getNavigationHandler()
               .handleNavigation(FacesContext.getCurrentInstance(), null, PaginasEnum.LOGIN.getPagina());
   }
}